package com.suntianci.stock.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.suntianci.stock.mapper.SysRoleMapper;
import com.suntianci.stock.mapper.SysRolePermissionMapper;
import com.suntianci.stock.mapper.SysUserRoleMapper;
import com.suntianci.stock.pojo.entity.SysRole;
import com.suntianci.stock.pojo.entity.SysRolePermission;
import com.suntianci.stock.service.RoleService;
import com.suntianci.stock.utils.IdWorker;
import com.suntianci.stock.vo.req.AddRoleReqVo;
import com.suntianci.stock.vo.req.RolesInfoReqVo;
import com.suntianci.stock.vo.req.UpdateRoleReqVo;
import com.suntianci.stock.vo.resp.PageResult;
import com.suntianci.stock.vo.resp.R;
import com.suntianci.stock.vo.resp.ResponseCode;
import lombok.extern.slf4j.Slf4j;
import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @ClassName RoleServiceImpl
 * @Author 孙天赐
 * @Date 2025/1/11 10:39
 * @Description TODO: 角色服务接口实现类
 */
@Service
@Slf4j
public class RoleServiceImpl implements RoleService {

    @Autowired
    private SysRoleMapper sysRoleMapper;

    @Autowired
    private SysUserRoleMapper sysUserRoleMapper;

    @Autowired
    private SysRolePermissionMapper sysRolePermissionMapper;

    @Autowired
    private IdWorker idWorker;


    /**
     * 分页查询角色信息
     *
     * @param rolesInfoReqVo
     * @return
     */
    @Override
    public R<PageResult<SysRole>> getRolesByPage(RolesInfoReqVo rolesInfoReqVo) {
        // 设置分页参数
        PageHelper.startPage(rolesInfoReqVo.getPageNum(), rolesInfoReqVo.getPageSize());
        // 查询数据
        List<SysRole> result = sysRoleMapper.selectAllRoles();
        // 将查询的Page对象封装到PageInfo下就可以获取分页的各种数据
        PageInfo<SysRole> pageInfo = new PageInfo<>(result);
        // 将pageInfo对象封装到pageResult下（使用自己定义的构造函数实现的封装）
        // 因为PageInfo包含了丰富的分页信息，而部分分页信息是前端不需要的
        PageResult<SysRole> pageResult = new PageResult<>(pageInfo);
        return R.ok(pageResult);
    }

    /**
     * 根据角色id删除角色信息
     *
     * @param roleId
     * @return
     */
    @Override
    public R<Void> deleteById(String roleId) {
        // 删除角色信息
        int row = sysRoleMapper.deleteByPrimaryKey(Long.valueOf(roleId));
        if (row > 0) {
            // 注意，也要删除用户角色表中的信息
            sysUserRoleMapper.deleteByRoleId(Long.valueOf(roleId));
            // 注意，也要删除角色权限表中的信息
            sysRolePermissionMapper.deleteByRoleId(Long.valueOf(roleId));
            return R.ok(ResponseCode.SUCCESS);
        }
        return R.error(ResponseCode.ERROR);
    }

    /**
     * 更新角色的状态信息
     *
     * @param roleId
     * @param status
     * @return
     */
    @Override
    public R<Void> updateRoleStatusById(String roleId, Integer status) {
        sysRoleMapper.updateRoleStatusById(roleId, status);
        return R.ok(ResponseCode.SUCCESS);
    }

    /**
     * 新增角色
     *
     * @param addRoleReqVo
     * @return
     */
    @Override
    public R<Void> addRole(AddRoleReqVo addRoleReqVo) {
        long roleId = idWorker.nextId();
        // 新建对象，用于插入数据
        SysRole sysRole = SysRole.builder()
                .id(roleId)
                .name(addRoleReqVo.getName())
                .description(addRoleReqVo.getDescription())
                .createTime(DateTime.now().toDate())
                .status(1)
                .deleted(1).build();
        // 添加角色
        int row = sysRoleMapper.insertSelective(sysRole);
        if (row == 0) {
            return R.error(ResponseCode.ERROR);
        }
        // 添加角色关联权限
        for (Long permissionsId : addRoleReqVo.getPermissionsIds()) {
            // 新建对象，用于插入数据
            SysRolePermission sysRolePermission = SysRolePermission.builder()
                    .id(idWorker.nextId())
                    .roleId(roleId)
                    .permissionId(permissionsId)
                    .createTime(DateTime.now().toDate()).build();
            // 插入数据
            sysRolePermissionMapper.insert(sysRolePermission);
        }
        return R.ok(ResponseCode.SUCCESS);
    }

    /**
     * 根据角色id查找对应的权限id集合
     *
     * @param roleId
     * @return
     */
    @Override
    public R<List<String>> getAllPermissionByRoleId(String roleId) {
        List<String> result = sysRolePermissionMapper.getPermissionIdByRoleId(roleId);
        return R.ok(result);

    }

    /**
     * 更新角色信息，包含角色关联的权限信息
     *
     * @param updateRoleReqVo
     * @return
     */
    @Override
    public R<Void> updateRole(UpdateRoleReqVo updateRoleReqVo) {
        // 1.更新角色表信息
        // 新建对象，用于更新数据
        SysRole sysRole = SysRole.builder()
                .id(updateRoleReqVo.getId())
                .name(updateRoleReqVo.getName())
                .description(updateRoleReqVo.getDescription())
                .updateTime(DateTime.now().toDate()).build();
        int row = sysRoleMapper.updateByPrimaryKeySelective(sysRole);

        // 2.删除角色权限表有关该角色的信息
        sysRolePermissionMapper.deleteByRoleId(updateRoleReqVo.getId());
        // 3.向角色权限表中新增信息
        for (Long permissionsId : updateRoleReqVo.getPermissionsIds()) {
            // 新建对象，用于插入数据
            SysRolePermission sysRolePermission = SysRolePermission.builder()
                    .id(idWorker.nextId())
                    .roleId(updateRoleReqVo.getId())
                    .permissionId(permissionsId)
                    .createTime(DateTime.now().toDate()).build();
            sysRolePermissionMapper.insert(sysRolePermission);
        }
        return R.ok(ResponseCode.SUCCESS);
    }
}
